package com.enuo.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.enuo.page.Filter;
import com.enuo.page.Order;
import com.enuo.page.Page;
import com.enuo.page.Pageable;

/**
 * Service - 基类
 * 
 * @author PTR Team
 * @version 1.0
 */
public interface BaseService<T, ID extends Serializable>
{
    /**
     * 查找实体对象
     * 
     * @param id
     *            ID
     * @return 实体对象，若不存在则返回null
     */
    T find(ID id);

    /**
     * 查找所有实体对象集合
     * 
     * @return 所有实体对象集合
     */
    List<T> findAll();

    /**
     * 查找实体对象集合
     * 
     * @param ids
     *            ID
     * @return 实体对象集合
     */
    @SuppressWarnings("unchecked")
    List<T> findList(ID... ids);

    /**
     * 查找实体对象集合
     * 
     * @param count
     *            数量
     * @param filters
     *            筛选
     * @param orders
     *            排序
     * @return 实体对象集合
     */
    List<T> findList(Integer count, List<Filter> filters, List<Order> orders);

    /**
     * 查找实体对象集合
     * 
     * @param first
     *            起始记录
     * @param count
     *            数量
     * @param filters
     *            筛选
     * @param orders
     *            排序
     * @return 实体对象集合
     */
    List<T> findList(Integer first, Integer count, List<Filter> filters,
            List<Order> orders);

    /**
     * 查找实体对象分页
     * 
     * @param pageable
     *            分页信息
     * @return 实体对象分页
     */
    Page<T> findPage(Pageable pageable);

    /**
     * 查询实体对象总数
     * 
     * @return 实体对象总数
     */
    long count();

    /**
     * 查询实体对象数量
     * 
     * @param filters
     *            筛选
     * @return 实体对象数量
     */
    long count(Filter... filters);

    /**
     * 判断实体对象是否存在
     * 
     * @param id
     *            ID
     * @return 实体对象是否存在
     */
    boolean exists(ID id);

    /**
     * 判断实体对象是否存在
     * 
     * @param filters
     *            筛选
     * @return 实体对象是否存在
     */
    boolean exists(Filter... filters);

    /**
     * 保存实体对象
     * 
     * @param entity
     *            实体对象
     */
    void save(T entity);

    /**
     * @Title: save
     * @Description: TODO(批量保存实体对象)
     * @param @param entitys 设定文件
     * @return void 返回类型
     * @throws
     */
    public void save(Collection<T> entitys);

    /**
     * 更新实体对象
     * 
     * @param entity
     *            实体对象
     * @return 实体对象
     */
    T update(T entity);

    /**
     * 更新实体对象
     * 
     * @param entity
     *            实体对象
     * @param ignoreProperties
     *            忽略属性
     * @return 实体对象
     */
    T update(T entity, String... ignoreProperties);

    /**
     * @Title: update
     * @Description: TODO(修改的实体集合)
     * @param @param entitys 设定文件
     * @return void 返回类型
     * @throws
     */
    void update(Collection<T> entitys);

    /**
     * 删除实体对象
     * 
     * @param id
     *            ID
     */
    void delete(ID id);

    /**
     * 删除实体对象
     * 
     * @param ids
     *            ID
     */
    @SuppressWarnings("unchecked")
    void delete(ID... ids);

    /**
     * 删除实体对象
     * 
     * @param entity
     *            实体对象
     */
    void delete(T entity);

    /**
     * 批量删除实体对象
     * 
     * @param entitys
     *            实体对象
     */
    void delete(Collection<T> entitys);

    /**
     * @Title: saveOrUpdate
     * @Description: TODO(修改或删除实体对象)
     * @param @param entity 设定文件
     * @return void 返回类型
     * @throws
     */
    void saveOrUpdate(T entity);

    /**
     * @Title: saveOrUpdate
     * @Description: TODO(批量保存或修改对象)
     * @param @param entitys 设定文件
     * @return void 返回类型
     * @throws
     */
    void saveOrUpdate(Collection<T> entitys);
}